package cn.arnold.java8newfuture.stream;

import cn.arnold.java8newfuture.Employee;
import cn.arnold.java8newfuture.EmployeeData;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @author Arnold-Xiang
 * @Info Stream的中间操作
 */
public class Demo2 {
    public static void main(String[] args) {
        test3();
    }

    /**
     * - `filter`：过滤流中的某些元素
     * - `limit(n)`：获取n个元素
     * - `skip(n)`：跳过n元素，配合limit(n)可实现分页
     * - `distinct`：通过流中元素的 hashCode() 和 equals() 去除重复元素
     */
    public static void test1() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(5);
        list.add(7);
        list.add(9);
        list.add(9);
        list.add(9);
        // `filter`：过滤流中大于5的元素
        list.stream().filter(u -> u > 5).forEach(System.out::println);
        System.out.println();

        // `limit(n)`：获取3个元素
        list.stream().limit(3).forEach(System.out::println);
        System.out.println();

        // `skip(n)`：跳过n元素，配合limit(n)可实现分页
        list.stream().skip(3).forEach(System.out::println);
        System.out.println();

        // `distinct`：通过流中元素的 hashCode() 和 equals() 去除重复元素
        list.stream().distinct().forEach(System.out::println);
        System.out.println();
    }

    /**
     * 映射
     */
    public static void test2() {
        // map(Function<? super T, ? extends R> mapper)
        List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
        // 将list的所有元素映射成大写
        list.stream().map(u -> u.toUpperCase()).forEach(System.out::println);
        System.out.println();

        // <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
        // 流中还包含流（集合里面套集合），
        List<String> list2 = Arrays.asList("a,b,c", "1,2,3");
        list2.stream().flatMap(s -> {
            String[] split = s.split(","); //{[a,b,c],[1,2,3]}
            Stream<String> s2 = Arrays.stream(split);
            return s2;
        }).forEach(System.out::println); // a b c 1 2 3
    }

    /**
     * 排序
     */
    public static void test3() {
        //自然排序
        List<Integer> list = Arrays.asList(-8, 30, 8, 16, 5, -2, 0);
        List<Employee> employeeList = EmployeeData.getEmployeeData();
        employeeList.stream().sorted((e1, e2) -> {
            list.stream().sorted().forEach(System.out::println);
        // 定制排序：对Employee按照年龄排序，若一样，则按照薪水排序
            int compare = Integer.compare(e1.getAge(), e2.getAge());
            if (compare != 0) {
                return compare;
            } else {
                return Double.compare(e1.getSalary(), e2.getSalary());
            }
        }).forEach(System.out::println);
    }

}
